package com.zhai.boot.util;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.stereotype.Component;


import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @package: com.zhai.boot.util
 * @project-name: zhai-boot
 * @description: redis工具类
 * @author: Created by 翟凤玺
 * @create-datetime: 2018-9-6 13:13
 */
@Component
public class RedisUtil {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 是否存在 key
     */
    public boolean hasKey(final String key) {
        return redisTemplate.hasKey(key);
    }

    /**
     * 获取 key 对应的 value
     */
    public Object get(final String key) {
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 保存 key 和 value
     */
    public void set(final String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    /**
     * 续期
     */
    public void expire(final String key, Long expireTime, TimeUnit timeUnit) {
        redisTemplate.expire(key, expireTime, timeUnit);
    }

    /**
     * 保存 key 和 value 并设置过期时间（单位：秒）
     */
    public void set(final String key, Object value, Long expireTime) {
        this.set(key,value);
        this.expire(key, expireTime, TimeUnit.SECONDS);
    }

    /**
     * 保存 key 和 value 并设置过期时间
     */
    public void set(final String key, Object value, Long expireTime, TimeUnit timeUnit) {
        this.set(key,value);
        this.expire(key, expireTime, timeUnit);
    }

    /**
     * 自增长
     */
    public String incr(String key, Long seed) {
        return redisTemplate.opsForValue().increment(key, seed).toString();
    }

    /**
     * 删除
     */
    public void delete(final String key) {
        if (this.hasKey(key)) {
            redisTemplate.delete(key);
        }
    }

    /**
     * 生成序列
     * @param key redis主键
     * @param prefix 前缀
     * @param seed 步长
     * @param size 补充串长度
     * @param padStr 补充串
     * @return
     */
    public String getAutoSeq(String key, String prefix, Long seed, Integer size, String padStr) {
        String incrStr = StringUtil.leftPad(this.incr(key, seed),size,padStr);
        StringBuilder result = new StringBuilder();
        result.append(prefix);
        result.append(incrStr);
        return result.toString();
    }

    /**
     * 生成ID
     * 前缀串（12位）=年（后2位）+月（2位）+日（2位）+时（2位）+分（2位）+秒（2位）
     * 自增串（6位）,从（000001）开始
     * 结果（18位）=前缀串（12位）+自增串（6位）
     * 示例：180906090022000001
     */
    public String getAutoSeqId(String key) {
        String prefix = DateUtil.fmtLocalDateTimeToStr(DateUtil.getCurrentLocalDateTime(), DateUtil.DATETIME_FMT_2);
        return this.getAutoSeq(key, prefix,1L, 6, "0");
    }

    /**
     * 生成Code
     * 前缀串 自定义
     * 自增串（6位）,从（000001）开始
     * 结果（18位）=日期串（12位）+自增串（6位）
     * 示例：A000001
     */
    public String getAutoSeqCode(String key, String prefix) {
        return this.getAutoSeq(key, prefix,1L, 6, "0");
    }

    /**
     * 执行lua脚本
     */
    public <T> T execute(RedisScript<T> script, List<?> keys, Object... args) {
        return (T) redisTemplate.execute(script, keys, args);
    }

}
